package blog

import (
	"context"
	"vblog/common"
)

type Service interface {
	// 创建博客
	CreateBlog(context.Context, *CreateBlogRequest) (*Blog, error)
	// 列表查询，返回的是列表
	QueryBlog(context.Context, *QueryBlogRequest) (*BlogSet, error)
	// 详情页查询
	DescribeBlog(context.Context, *DescribeBlogRequest) (*Blog, error)
	// 修改博客状态
	UpdateBlogStatus(context.Context, *UpdateBlogStatusRequest) (*Blog, error)
	// 更新博客（增量/全量）
	UpdateBlog(context.Context, *UpdateBlogRequest) (*Blog, error)
	// 删除博客
	DeleteBlog(context.Context, *DeleteBlogRequest) error
	// 审核博客
	AuditBlog(context.Context,*AuditBlogRequest) (*Blog,error) 
}

type CreateBlogRequest struct {
	// 文章标题
	Title string `json:"title"`
	// 作者
	Author string `json:"author"`
	// 用户登录后, 通过Token知道是哪个用户
	CreateBy string `json:"create_by"`
	// 文章内容
	Content string `json:"content"`
	// 概要
	Summary string `json:"summary"`
	// 标签
	Tags map[string]string `json:"tags" gorm:"serializer:json"`	
}

func NewCreateBlogRequest() *CreateBlogRequest {
	return  &CreateBlogRequest{
		Tags: map[string]string{},
	}
}
type QueryBlogRequest struct {
	// 页的大小(一页包括多少数据)
	PageSize int `json:"page_size"`
	// 当前处于几页
	PageNumber int `json:"page_number"`
	// 0 表示草稿状态；nil 没有这个过滤条件
	Status *Status `json:"status"`	
}

func NewQueryBlogRequest() *QueryBlogRequest {
	return &QueryBlogRequest{
		PageSize: 10,
		PageNumber: 1,
	}
}
// 查询时的偏移量
func (b *QueryBlogRequest) MyOffset() int{
	return (b.PageSize * (b.PageNumber -1))
}

type DescribeBlogRequest struct {
	BlogId string `json:"blog_id"`	
}

func NewDescribeBlogRequest() *DescribeBlogRequest{
	return &DescribeBlogRequest{
	}
}

type UpdateBlogStatusRequest struct {
}

type UpdateBlogRequest struct {
	*CreateBlogRequest
	BlogId string `json:"blog_id"`
	// 更新模式（全量/增量）
	UpdateMode UpdateMode `json:"update_mode"`
	// 用于数据范围
	Scope *common.Scope `json:"scope"`
}

func NewUpdateBlogRequest_Put() *UpdateBlogRequest{
	return &UpdateBlogRequest{
		CreateBlogRequest: NewCreateBlogRequest(),
		UpdateMode: UPDATE_MODE_PUT,
	}
}

func UpdateBlogRequest_Patch() *UpdateBlogRequest{
	return &UpdateBlogRequest{
		CreateBlogRequest: NewCreateBlogRequest(),
		UpdateMode: UPDATE_MODE_PATCH,
	}
}

type DeleteBlogRequest struct {
	BlogId string `json:"blog_id"`
}

func NewDeleteBlogRequest() *DeleteBlogRequest{
	return &DeleteBlogRequest{}
}


type AuditBlogRequest struct {
	// 审核的文章
	BlogId string `json:"blog_id"`
	// 是否审核成功
	IsAuditPass bool `json:"is_audit_pass"`	
}

func NewAuditBlogRequest() *AuditBlogRequest{
	return &AuditBlogRequest{
	}
}